/**
 * @file tm1640.c
 * @author  xiaowine (xiaowine@sina.cn)
 * @brief
 * @version 01.00
 * @date    2022-03-02
 *
 * @copyright Copyright (c) {2020}  xiaowine
 *
 * @par 修改日志:
 * <table>
 * <tr><th>Date       <th>Version <th>Author  <th>Description
 * <tr><td>2022-03-02 <td>1.0     <td>wangh     <td>内容
 * </table>
 * ******************************************************************
 * *                   .::::
 * *                 .::::::::
 * *                ::::::::::
 * *             ..:::::::::::
 * *          '::::::::::::
 * *            .:::::::::
 * *       '::::::::::::::..        女神助攻,流量冲天
 * *            ..::::::::::::.     永不宕机,代码无bug
 * *          ``:::::::::::::::
 * *           ::::``:::::::::'        .:::
 * *          ::::'   ':::::'       .::::::::
 * *        .::::'      ::::     .:::::::'::::
 * *       .:::'       :::::  .:::::::::' ':::::
 * *      .::'        :::::.:::::::::'      ':::::
 * *     .::'         ::::::::::::::'         ``::::
 * * ...:::           ::::::::::::'              ``::
 * *```` ':.          ':::::::::'                  ::::.
 * *                   '.:::::'                    ':'````.
 * ******************************************************************
 */

/* Private includes ----------------------------------------------------------*/
#include "tm1640.h"
#include "cmsis_os2.h"  // CMSIS RTOS header file
/* Private typedef -----------------------------------------------------------*/

/* Private define ------------------------------------------------------------*/

/* Private macro -------------------------------------------------------------*/

/* Private variables ---------------------------------------------------------*/
unsigned char const ch_table[] = {
    0x3F,  //"0"
    0x06,  //"1"
    0x5B,  //"2"
    0x4F,  //"3"
    0x66,  //"4"
    0x6D,  //"5"
    0x7D,  //"6"
    0x07,  //"7"
    0x7F,  //"8"
    0x6F,  //"9"
    0x77,  //"A"
    0x7C,  //"B"
    0x39,  //"C"
    0x5E,  //"D"
    0x79,  //"E"
    0x71,  //"F"
    0x76,  //"H"
    0x38,  //"L"
    0x37,  //"n"
    0x3E,  //"u"
    0x73,  //"P"
    0x5C,  //"o"
    0x40,  //"-"
    0x00,  //熄灭
};
/* Private function prototypes -----------------------------------------------*/

/* Private user code ---------------------------------------------------------*/

//*************************************
// 函数名称：_Nopt
// 函数功能：延时函数
// 入口参数：延时时间
// 出口参数：无
//***************************************/
void Nop1640(uint16_t T_Dly)
{
    while (T_Dly--) {
        // __nop();
    }
    return;
}
//****************************************
// 函数名称：TM1640Start
// 函数功能：TM1640起始信号
// 入口参数：无
// 出口参数：无
//***************************************/
void TM1640Start(void)
{
    TM1640_DIN(1);
    Nop1640(VT_DLYNOP);
    TM1640_SCK(1);
    Nop1640(VT_DLY1640);
    TM1640_DIN(0);
    Nop1640(VT_DLY1640);
    TM1640_SCK(0);
    Nop1640(VT_DLY1640);
}
//*************************************
// 函数名称：TM1640Stop
// 函数功能：TM1640结束信号
// 入口参数：无
// 出口参数：无
//***************************************/
void TM1640Stop(void)
{
    TM1640_DIN(0);
    Nop1640(VT_DLYNOP);
    TM1640_SCK(1);
    Nop1640(VT_DLY1640);
    TM1640_DIN(1);
    Nop1640(VT_DLY1640);
    TM1640_SCK(0);
    Nop1640(VT_DLY1640);
}
//*************************************
// 函数名称：TM1640WriteByte
// 函数功能：TM1640写一字节数据
// 入口参数：要写的数据
// 出口参数：无
//***************************************/
void TM1640WriteByte(uint8_t date)
{
    uint8_t i;
    uint8_t Tmp;

    Tmp = date;

    TM1640_DIN(0);
    Nop1640(VT_DLYNOP);
    TM1640_SCK(0);

    for (i = 0; i < 8; i++) {
        TM1640_SCK(0);
        Nop1640(VT_DLYNOP);
        if (Tmp & 0x01) {
            TM1640_DIN(1);
            Nop1640(VT_DLY1640);
        } else {
            TM1640_DIN(0);
            Nop1640(VT_DLY1640);
        }
        TM1640_SCK(1);
        Tmp = Tmp >> 1;
        Nop1640(VT_DLYNOP);
    }

    TM1640_SCK(0);
    Nop1640(VT_DLYNOP);
    TM1640_DIN(0);
}
//*************************************
// 函数名称：TM1640_Init
// 函数功能：TM1640设备初始化
// 入口参数：0 1 代表 显示关 显示开
// 出口参数：无
//***************************************/
void TM1640_Init(uint8_t InValue)
{
    TM1640_DIN(1);
    Nop1640(VT_DLYNOP);
    TM1640_SCK(1);

    if (InValue == DSP1640_DIS)  //显示关
    {
        TM1640Start();                     //数据写模式设置
        TM1640WriteByte(SET_DSP1640_DIS);  //显示关控制
        TM1640Stop();
    } else {
        TM1640Start();                    //数据写模式设置
        TM1640WriteByte(SET_DATA_ORDER);  //数据命令设置 地址自动加1
        TM1640Stop();

        TM1640Start();                 //显示亮度设置
        TM1640WriteByte(SET_DISPLAY);  //显示命令控制  脉冲宽度14/16
        TM1640Stop();
    }
}
//*************************************
// 函数名称：TM1640_SendData
// 函数功能：发送显示缓存
// 入口参数：1640要写数据的起始地址
//           显示数据缓存的起始地址 数据长度
// 出口参数：无
//***************************************/
void TM1640_SendData(uint8_t Addr1640, uint8_t *a, uint8_t DataLong)
{
    uint8_t i;

    TM1640Start();
    TM1640WriteByte(Addr1640);  //设置起始地址

    for (i = 0; i < DataLong; i++) {
        TM1640WriteByte(a[i]);
    }

    TM1640Stop();
}
